import sys
from datetime import datetime

import requests
import os
from loguru import logger


class GiteeManger:
    def __init__(self, owner, repo, token):
        self.owner = owner
        self.repo = repo
        self.token = token
        self.repo_url = f""
        self.headers = {
            "Accept": "application/vnd.github.v3+json",
            "Authorization": f"token {self.token}",
        }
        self.base_url = f"https://gitee.com/api/v5/repos/{owner}/{repo}"
        self.params = {"access_token": token,
                      "owner": owner,
                      "repo": repo}
        self.release_id = None
        self.env_release_version = "1.0"
    def get_release_list(self):
        """
        获取仓库下的所有 Release。
        :return: 返回所有 Release 的 JSON 格式数据，如果请求失败则返回 None
        """
        params = {"access_token": self.token,
                      "owner": self.owner,
                      "repo": self.repo}
        url = f"{self.base_url}/releases"
        try:
            logger.info(f"获取 releases 列表: {url}")
            # 发起 HTTP GET 请求获取所有 Release
            response = requests.get(url, headers=self.headers, params=params, timeout=50)
            # 检查响应状态码是否为 200（HTTP OK）
            if response.status_code != 200:
                # 如果状态码不是 200，记录错误日志并返回 None
                logger.error(f"获取 releases 失败: {response.text}")
                return
            logger.info(f"获取 releases 成功: {response.text}")
            return response.json()

        except Exception as e:
            # 捕获请求过程中可能发生的异常，并记录错误日志
            logger.error(f"获取 releases 失败: {e}")
            sys.exit(2)
    def get_releases_file_list(self, release_id):
        """
        获取仓库下的指定 Release 的所有附件
        :param release_id: Release 的唯一标识符
        :return: 返回附件列表的 JSON 格式数据，如果请求失败则返回 None
        """
        # 构造请求 URL
        url = f"{self.base_url}/releases/{release_id}/attach_files"
        try:
            # 发起 HTTP GET 请求获取附件列表
            response = requests.get(url, headers=self.headers, params=self.params, timeout=5)
            # 检查响应状态码是否为 200（HTTP OK）
            if response.status_code != 200:
                # 如果状态码不是 200，记录错误日志并返回 None
                logger.error(f"获取 releases 失败: {response.text}")
                return
        except Exception as e:
            # 捕获请求过程中可能发生的异常，并记录错误日志
            logger.error(f"获取 releases 失败: {e}")
            return
        # 返回响应的 JSON 格式数据
        return response.json()
    def create_release(self):
        """
        创建一个新版本发布。

        该方法通过发送POST请求到GitHub API来创建一个新版本发布。它使用类实例的base_url属性来构建请求URL，
        并使用预定义的RELEASE_VERSION作为版本标签和名称。发布描述被设置为自动为ad.txt生成的版本。
        """
        # 构建创建版本的URL
        create_url = f"{self.base_url}/releases"
        params = {"access_token": self.token,
                      "owner": self.owner,
                      "repo": self.repo,
                      "tag_name": self.env_release_version,
                      "name": self.env_release_version,
                      "body": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
                  "target_commitish": "master"}

        try:
            # 发送POST请求创建新版本
            response = requests.post(create_url, params=params, timeout=50)
        except requests.exceptions.Timeout:
            # 处理请求超时异常
            logger.error("请求超时")
            return
        except Exception as e:
            # 处理其他异常
            logger.error(f"创建新版本失败: {e}")
            return

        # 解析响应JSON以获取新版本的信息
        release_info = response.json()

        try:
            # 从版本信息中提取版本ID
            self.release_id = release_info["id"]
        except KeyError:
            # 如果版本信息中不包含ID，记录错误并返回
            logger.error("Release does not contain id")
            logger.debug(release_info)
            return

        # 打印成功创建版本的消息
        print(f"✅ 已创建新版本: {self.env_release_version}")
    def delete_release(self, release_id):
        """
        删除指定的版本。

        构建删除指定版本的URL，尝试发送DELETE请求以删除版本。
        处理可能发生的异常，包括请求超时和其他异常，并根据响应状态码判断删除操作是否成功。

        参数:
        release_id (str): 要删除的版本的ID。

        返回:
        无返回值。
        """
        # 构建删除版本的URL
        delete_url = f"{self.base_url}/releases/{release_id}"

        try:
            # 发送DELETE请求，尝试删除版本
            response = requests.delete(delete_url, params=self.params, headers=self.headers, timeout=50)
        except requests.exceptions.Timeout:
            # 处理请求超时异常
            logger.error("请求超时")
            return
        except Exception as e:
            # 处理其他异常
            logger.error(f"删除版本失败: {e}")
            return

        # 根据响应状态码判断删除操作是否成功
        if response.status_code == 204:
            print(f"✅ 版本 {self.env_release_version} 已删除")
    def upload_file(self, file_to_upload, release_id):
        """
        上传文件到 Gitee 上的指定版本。

        参数:
        file_to_upload (str): 要上传的文件的路径。
        release_id (str): 要上传文件的版本ID。

        返回:
        无返回值。
        """
        # 构建上传文件的URL
        upload_url = f"{self.base_url}/releases/{release_id}/attach_files"
        try:
            # 打开要上传的文件
            with open(file_to_upload, "rb") as file:
                response = requests.post(upload_url, files={"file": file}, params=self.params, headers=self.headers, timeout=50)
                if response.status_code == 201:
                    logger.info(f"✅ 文件 {file_to_upload} 已上传到版本 {self.env_release_version}")
                else:
                    logger.error(f"❌ 文件 {file_to_upload} 上传到版本 {self.env_release_version} 失败")
                    logger.debug(response.text)
                    logger.debug(response.status_code)
                    return
        except requests.exceptions.Timeout:
            # 处理请求超时异常
            logger.error("请求超时")
            return
        except Exception as e:
            # 处理其他异常
            logger.error(f"上传文件失败: {e}")
            return
    def delete_release_file(self, release_id, file_name):
        """
        删除仓库下指定 Release 的指定附件。

        参数:
        release_id (str):
        """
        url = f"{self.base_url}/releases/{release_id}/attach_files/{file_name}"

if __name__ == "__main__":
    # # 配置 Gitee 相关信息
    GITEE_OWNER = os.getenv("gitee_username")
    GITEE_REPO = "adguard"
    GITEE_TOKEN = os.getenv("gitee_personal_access_token")
    RELEASE_VERSION = "1.0"
    gitee = GiteeManger(owner=GITEE_OWNER, repo=GITEE_REPO, token=GITEE_TOKEN)
    res = gitee.get_release_list()
    gitee.delete_release(res[0]['id'])
    gitee.create_release()
    res = gitee.get_release_list()
    print(res[0]['id'])
    gitee.upload_file("D:/Code/gitee/adguard/ad.txt", res[0]['id'])
